const Koa = require("koa");
const Router = require("@koa/router");
const static = require("koa-static");
const mount = require("koa-mount");
const compose = require("koa-compose");
const fs = require("fs");
const util = require("util");

const app = new Koa();
app.use(mount("/public", static(__dirname + "/public")));
const router = new Router();

// 在最外层添加异常捕获的中间件
// 捕获异常方式1：使用try...catch
// 同时包含最外层的异常捕获中间件和监听error事件的中间件，正常情况下不会处理error事件，除非手动告知ctx.app.emit("error", error, ctx);
app.use(async (ctx, next) => {
  try {
    await next();
  } catch (error) {
    ctx.status = error.status || 500;
    ctx.body = "服务器异常";
    ctx.app.emit("error", error, ctx);
  }
});

app.use(async (ctx, next) => {
  JSON.parse("{}");
  // ctx.body = "Hello, World!";
  // next();   // 无法捕获异常，因为next()没有捕获异常的能力
  // return next(); // 捕获异常，因为return next()会捕获异常
  await next(); // 捕获异常，因为await next()会捕获异常
});

app.use(async (ctx, next) => {
  JSON.parse("adfasd");
  ctx.body = "Hello, World!";
  await next();
});

// 捕获异常方式2：使用on('error')事件
app.on("error", (err, ctx) => {
  console.log("Caught error:", err);
});

/* app.use((ctx) => {
  try {
    JSON.parse("adfasd");
    ctx.body = "Hello, World!";
  } catch (err) {
    // ctx.response.status = 500;
    // ctx.body = "Internal Server Error";

    // throw 方法
    ctx.throw(500, "Internal Server Error");
  }
}); */

app.listen(3000, () => {
  console.log("Server is running at http://localhost:3000");
});
